package web后端.AOP_面向切面编程.基础.概述_快速入门;

/**
 * AOP——面向切面编程<p>
 * 快速入门详见项目<a href="#">springboot-study-auxiliary-system</a><p></p>
 *
 * AOP的场景：<p>
 * 记录操作日志<p>
 * 权限控制<p>
 * 事务管理（spring的事务管理底层就是通过AOP来实现的）<p></p>
 *
 * AOP的优势：<p>
 * 1、代码无侵入<p>
 * 2、减少重复代码<p>
 * 3、提高开发效率<p>
 * 4、维护方便
 */
public class index {
    /**
     * AOP（Aspect Oriented Programming）：面向切面编程/面向方面编程。<a href="#">其实就是面向特定方法编程</a><p></p>
     * <p></p>
     * 为什么需要面向特定方法编程？<p>
     * 场景：现有一个项目，包括很多业务方法，有的方法耗时较长，我们需要进行优化<p>
     * 首先就要先定位执行耗时较长的方法，然后再根据这个方法进行优化<p>
     * 此时要定位耗时较长的方法，就需要统计当前项目中每一个方法的执行耗时<p></p>
     * <p>
     * 以往的思路是：对每一个方法执行操作————记录运行前时刻和运行后时刻，然后相减<p>
     * 不难看出，这个方案很繁琐、很麻烦<p></p>
     * <p>
     * 而如果通过AOP，可以在不改动原始方法的基础上，来针对于原始方法进行编程<p>
     * 这个编程呢，可以对原始方法进行增强，也可以改变原始方法的功能<p>
     * 而对于上面的案例，我们只需要定义一个模板方法，然后计算耗时这样的公共部分就可以定义在这个模板方法中<p>
     * 在这个方法中，先记录方法运行前时刻，最后记录方法运行结束的时刻，这两步操作之间来运行原始方法<p></p>
     * <p>
     * 面向这样的一个或者多个方法进行编程，就称为面向切面编程<p></p>
     * <p>
     * 项目运行时，要调用其中一个原始方法，程序并不会之间执行这个方法的代码<p>
     * 而是先执行模板方法的逻辑，然后适时执行这个原始方法<p></p>
     * <p></p>
     * <p>
     * 看到这里，会发现这里和之前的动态代理很类似<p>
     * 这里的模板方法中的逻辑，就是代理对象中的逻辑<p></p>
     * <p></p>
     * <p>
     * AOP的实现：<p>
     * 其实动态代理就是面向切面编程AOP最主流的实现<p>
     * 而SpringAOP是Spring框架的高级技术，旨在在管理Bean对象的过程中，主要通过底层的动态代理机制，对特定方法进行编程<p></p>
     * <p></p>
     * <p>
     * SpringAOP的使用：<p>
     * 1、导入AOP的依赖：
     * <dependency>
     * <groupId>org.springframework.boot</groupId>
     * <artifactId>spring-boot-starter-aop</artifactId>
     * </dependency>
     * <p>
     * 2、编写AOP程序：针对特定方法根据业务需要进行编程（主要就是定义模板方法）<p></p>
     * <p>
     * 模板方法所在类需要交给IOC容器管理，所以要加上 <a href="#">@Component</a><p>
     * 这个类不同于其他类，是一个AOP类，要加上<a href="#">@Aspect</a><p>
     * 在模板方法上写一个<a href="#">@Around注解</a><p>
     * 格式：<p>
     * {@code @Around("execution(* 包名.类名或接口名.方法名(..))")}（切入点表达式）<p></p>
     * <p></p>
     *
     *
     * @param args
     */
    public static void main(String[] args) {

    }
}
